package jp.ac.u_tokyo.dch.action.csv;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import jp.ac.u_tokyo.dch.core.db.DBConnection;
import jp.ac.u_tokyo.dch.service.CsvUploadService;
import jp.ac.u_tokyo.dch.service.DaoServiceAware;
import jp.ac.u_tokyo.dch.service.Transaction;
import jp.ac.u_tokyo.dch.util.DchCommonUtil;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.xwork.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import au.com.bytecode.opencsv.CSVReader;

import com.opensymphony.xwork2.ActionSupport;
/**
* ファイルアップロードを担当
* @version 1.1
*
*/
public class CsvUploadAction extends ActionSupport implements DaoServiceAware {

	/**
	 *シリアル番号
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * ログ
	 */
	protected Logger logger = Logger.getLogger(getClass());

	 /**
	 * DBコネクションオブジェクト
	 */
	private DBConnection dbConnection = null;
	/**
	 * アップロードファイル情報
	 */
	private File upload;
	/**
	 * コンテンツタイプ
	 */
	private String uploadContentType;
	/**
	 * アップロードファイル名
	 */
	private String uploadFileName;


	/**
	 * ファイルアップロード処理を行う
	 * @return 結果
	 * @throws Exception
	 */
	@Transaction
	public String doUpload() throws Exception {

		if (upload == null) {
			addFieldError("uploadFile", "ファイルを選択してください。");
			return ERROR;
		}

		logger.info("absolutePath:"+ upload.getAbsolutePath());
		logger.info("attachFileContentType:"+ uploadContentType);
		logger.info("attachFileFileName:"+ uploadFileName);

		String ext = FilenameUtils.getExtension(uploadFileName);

		if (!StringUtils.contains(ext, "csv")) {
			addFieldError("uploadFile", "CSVファイル形式ではありません。");
			return ERROR;
		}
		CSVReader csvReader = null;
		try {
			csvReader = new CSVReader(new BufferedReader(new FileReader(upload)));

			String[] schemaInfo = csvReader.readNext();
			if (!StringUtils.isNumeric(schemaInfo[0])) {
				addFieldError("uploadFile", "有効なファイル形式ではありません。");
				return ERROR;
			}
			String[] oyaDataInfo = csvReader.readNext();
			if (!StringUtils.isNumeric(oyaDataInfo[0])) {
				addFieldError("uploadFile", "有効なファイル形式ではありません。");
				return ERROR;
			}
			CsvUploadService service = new CsvUploadService(dbConnection);

			String fUserId = DchCommonUtil.getLoginIdFromRequest(ServletActionContext.getRequest());
			String currentDate = DchCommonUtil.getCurrentDate();
			service.insert(schemaInfo[0], oyaDataInfo[0], fUserId, currentDate, csvReader);


		} catch (IOException e) {
			addFieldError("uploadFile", "ファイルを読み込む中エラーが発生しました。");
			return ERROR;
		} finally {
			csvReader.close();
		}


		return SUCCESS;
	}
	/**
	 * アップロードファイルを返す
	 * @return アップロードファイル
	 */
	public File getUpload() {
		return upload;
	}
	/**
	 * アップロードファイルをセットする
	 * @param アップロードファイル
	 */
	public void setUpload(File upload) {
		this.upload = upload;
	}
	/**
	 * アップロードコンテンツタイプを返す
	 * @return アップロードコンテンツタイプ
	 */
	public String getUploadContentType() {
		return uploadContentType;
	}
	/**
	 * アップロードコンテンツタイプをセットする
	 * @param アップロードコンテンツタイプ
	 */
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	/**
	 * アップロードファイル名を返す
	 * @return アップロードファイル名
	 */
	public String getUploadFileName() {
		return uploadFileName;
	}
	/**
	 * アップロードファイル名をセットする
	 * @param アップロードファイル名
	 */
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	@Override
	public void setDBConnection(DBConnection con) {
		dbConnection = con;

	}



}
